package org.wdcode.web.params;

import org.wdcode.common.constants.EncodingConstants;
import org.wdcode.common.constants.StringConstants;
import org.wdcode.common.params.WdParams;
import org.wdcode.web.email.EmailParse;
import org.wdcode.web.enums.SaveAttribute;

/**
 * WdWeb包参数读取类
 * @author WD
 * @since JDK6
 * @version 1.0 2010-01-05
 */
public final class WdWebParams extends WdParams {
	/* 读取配置变量 */
	/* Email */
	private static String			emailFrom		= StringConstants.EMPTY;											// 系统发送邮件所用地址
	private static String			emailPassword	= StringConstants.EMPTY;											// 邮件密码
	private static String			emailHost		= StringConstants.EMPTY;											// 邮件服务器Host
	private static EmailParse		emailParse		= EmailParse.JavaMail;												// 发送Email使用的默认包
	private static boolean			emailAuth		= true;															// 发送Email是否验证
	private static String			emailEncoding	= EncodingConstants.UTF_8;											// 发送Email使用的编码格式

	/* 验证码用 */
	private static String			verifyCodeStr	= "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 验证码出现的字符集
	private static char[]			verifyCode		= verifyCodeStr.toCharArray();										// 验证码出现的字符集
	private static int				verifyLength	= 4;																// 验证码长度
	private static String			verifyKey		= "verifyCode";													// 保存到session中的key
	private static String			verifyFont		= "Times New Roman";												// 验证码字体

	/* 保存属性用 */
	private static SaveAttribute	saveAttribute;																		// 默认使用Cookie保存
	private static String			saveUser		= "user";															// 默认使用用户信息保存

	/* FTP使用 */
	private static String			ftpHost			= StringConstants.EMPTY;											// FTP主机
	private static int				ftpPort			= 21;																// FTP端口
	private static String			ftpUser			= StringConstants.EMPTY;											// FTP用户名
	private static String			ftpPassword		= StringConstants.EMPTY;											// FTP密码
	private static int				ftpBufferSize	= 1024;															// FTP密码
	private static String			ftpEncoding		= EncodingConstants.UTF_8;											// FTP密码
	private static int				ftpTimeout		= 0;																// FTP超时时间

	/* 读取配置字符串 */

	/* Email */
	private final static String		EMAIL_FROM		= "email.from";													// 系统发送邮件所用地址
	private final static String		EMAIL_PASSWORD	= "email.password";												// 邮件密码
	private final static String		EMAIL_HOST		= "email.host";													// 邮件服务器Host
	private final static String		EMAIL_PARSE		= "email.parse";													// 发送Email使用的默认包
	private final static String		EMAIL_AUTH		= "email.auth";													// 发送Email是否验证
	private final static String		EMAIL_ENCODING	= "email.encoding";												// 发送Email使用的编码格式

	/* 验证码用 */
	private final static String		VERIFY_CODE		= "verify.code";													// 验证码出现的字符集
	private final static String		VERIFY_LENGTH	= "verify.length";													// 验证码长度
	private final static String		VERIFY_KEY		= "verify.key";													// 保存到session中的key
	private final static String		VERIFY_FONT		= "verify.font";													// 验证码字体

	/* 保存属性用 */
	private final static String		SAVE_ATTRIBUTE	= "save.attribute";												// 保存属性
	private final static String		SAVE_USER		= "save.user";														// 保存用户信息

	/* FTP使用 */
	private final static String		FTP_HOST		= "ftp.host";														// FTP主机
	private final static String		FTP_PORT		= "ftp.port";														// FTP端口
	private final static String		FTP_USER		= "ftp.user";														// FTP用户名
	private final static String		FTP_PASSWORD	= "ftp.password";													// FTP密码
	private final static String		FTP_BUFFER_SIZE	= "ftp.buffersize";												// FTP密码
	private final static String		FTP_ENCODING	= "ftp.encoding";													// FTP密码
	private final static String		FTP_TIMEOUT		= "ftp.timeout";													// FTP超时时间

	// 静态初始化
	static {
		read();
	}

	/**
	 * 读取参数配置
	 */
	public final static void read() {
		/* 获得 Email 配置 */
		emailAuth = getBoolean(EMAIL_AUTH, emailAuth);
		emailHost = getString(EMAIL_HOST, emailHost);
		emailFrom = getString(EMAIL_FROM, emailFrom);
		emailPassword = getString(EMAIL_PASSWORD, emailPassword);
		emailParse = "Apache".equals(getString(EMAIL_PARSE)) ? EmailParse.Apache : EmailParse.JavaMail;
		emailEncoding = getString(EMAIL_ENCODING, emailEncoding);

		/* 验证码用 */
		verifyCodeStr = getString(VERIFY_CODE, verifyCodeStr);
		verifyCode = verifyCodeStr.toCharArray();
		verifyLength = getInt(VERIFY_LENGTH, verifyLength);
		verifyKey = getString(VERIFY_KEY, verifyKey);
		verifyFont = getString(VERIFY_FONT, verifyFont);

		/* 保存属性用 */
		saveAttribute = "session".equalsIgnoreCase(getString(SAVE_ATTRIBUTE)) ? SaveAttribute.SESSION : SaveAttribute.COOKIE;
		saveUser = getString(SAVE_USER, saveUser);

		/* FTP使用 */
		ftpBufferSize = getInt(FTP_BUFFER_SIZE, ftpBufferSize);
		ftpEncoding = getString(FTP_ENCODING, ftpEncoding);
		ftpHost = getString(FTP_HOST, ftpHost);
		ftpPassword = getString(FTP_PASSWORD, ftpPassword);
		ftpPort = getInt(FTP_PORT, ftpPort);
		ftpTimeout = getInt(FTP_TIMEOUT, ftpTimeout);
		ftpUser = getString(FTP_USER, ftpUser);
	}

	/**
	 * FTP端口<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用21<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: ftp.port = ? <br/>
	 * XML: {@literal <ftp><port>?</port></ftp>}</h2>
	 * @return FTP端口
	 */
	public final static int getFtpPort() {
		return ftpPort;
	}

	/**
	 * FTP连接超时时间<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用0<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: ftp.timeout = ? <br/>
	 * XML: {@literal <ftp><timeout>?</timeout></ftp>}</h2>
	 * @return FTP连接超时时间
	 */
	public final static int getFtpTimeout() {
		return ftpTimeout;
	}

	/**
	 * FTP缓存大小<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用1024<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: ftp.buffersize = ? <br/>
	 * XML: {@literal <ftp><buffersize>?</buffersize></ftp>}</h2>
	 * @return FTP缓存大小
	 */
	public final static int getFtpBufferSize() {
		return ftpBufferSize;
	}

	/**
	 * FTP编码<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用UTF-8<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: ftp.encoding = ? <br/>
	 * XML: {@literal <ftp><encoding>?</encoding></ftp>}</h2>
	 * @return FTP缓存大小
	 */
	public final static String getFtpEncoding() {
		return ftpEncoding;
	}

	/**
	 * FTP登录密码<br/>
	 * 需在配置文件中配置<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: ftp.password = ? <br/>
	 * XML: {@literal <ftp><password>?</password></ftp>}</h2>
	 * @return FTP登录密码
	 */
	public final static String getFtpPassword() {
		return ftpPassword;
	}

	/**
	 * FTP登录用户<br/>
	 * 需在配置文件中配置<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: ftp.user = ? <br/>
	 * XML: {@literal <ftp><user>?</user></ftp>}</h2>
	 * @return FTP登录用户
	 */
	public final static String getFtpUser() {
		return ftpUser;
	}

	/**
	 * FTP主机<br/>
	 * 需在配置文件中配置<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: ftp.host = ? <br/>
	 * XML: {@literal <ftp><host>?</host></ftp>}</h2>
	 * @return FTP主机
	 */
	public final static String getFtpHost() {
		return ftpHost;
	}

	/**
	 * 保存用户信息<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用user<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: save.user = ? <br/>
	 * XML: {@literal <save><user>?</user></save>}</h2>
	 * @return 保存用户信息
	 */
	public final static String getSaveUser() {
		return saveUser;
	}

	/**
	 * 保存属性方式<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用cookie<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: save.attribute = ? <br/>
	 * XML: {@literal <save><attribute>?</attribute></save>}</h2>
	 * @return 保存属性方式
	 */
	public final static SaveAttribute getSaveAttribute() {
		return saveAttribute;
	}

	/**
	 * 验证码出现的字符集,验证码类使用<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用全部字母和数字<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: verify.code = ? <br/>
	 * XML: {@literal <verify><code>?</code></verify>}</h2>
	 * @see org.wdcode.web.tools.VerifyCode
	 * @return 验证码出现的字符集
	 */
	public final static char[] getVerifyCode() {
		return verifyCode;
	}

	/**
	 * 验证码长度,验证码类使用<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用4<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: verify.length = ? <br/>
	 * XML: {@literal <verify><length>?</length></verify>}</h2>
	 * @see org.wdcode.web.tools.VerifyCode
	 * @return 验证码长度
	 */
	public final static int getVerifyLength() {
		return verifyLength;
	}

	/**
	 * 验证码保存到session中的key,验证码类使用<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用verifyCode<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: verify.key = ? <br/>
	 * XML: {@literal <verify><key>?</key></verify>}</h2>
	 * @see org.wdcode.web.tools.VerifyCode
	 * @return 验证码保存到session中的key
	 */
	public final static String getVerifyKey() {
		return verifyKey;
	}

	/**
	 * 验证码字体,验证码类使用<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用Times New Roman<br/>
	 * <h2>注: 默认字体不支持中文,要想使用中文,请配置一个支持中文的字体,如 宋体</h2><br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: verify.Font = ? <br/>
	 * XML: {@literal <verify><Font>?</Font></verify>}</h2>
	 * @see org.wdcode.web.tools.VerifyCode
	 * @return 验证码字体
	 */
	public final static String getVerifyFont() {
		return verifyFont;
	}

	/**
	 * 设置验证码字体
	 * @param font 验证码字体
	 */
	public final static void setVerifyFont(String font) {
		verifyFont = font;
		setProperty(VERIFY_FONT, verifyFont);
	}

	/**
	 * 设置验证码出现的字符集
	 * @param code 验证码出现的字符集
	 */
	public final static void setVerifyCode(String code) {
		verifyCodeStr = code;
		verifyCode = verifyCodeStr.toCharArray();
		setProperty(VERIFY_CODE, verifyCodeStr);
	}

	/**
	 * 设置验证码长度
	 * @param length 验证码长度
	 * @return 验证码长度
	 */
	public final static void setVerifyLength(int length) {
		verifyLength = length;
		setProperty(VERIFY_LENGTH, verifyLength);
	}

	/**
	 * 设置验证码保存到session中的key
	 * @param key 验证码保存到session中的key
	 */
	public final static void setVerifyKey(String key) {
		verifyKey = key;
		setProperty(VERIFY_KEY, verifyKey);
	}

	/**
	 * 获得发送Email使用的编码格式,org.wdcode.web.email.EmailUtil使用.<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用UTF-8<br/>
	 * <h2>注: 取值是编码格式 如 UTF-8,GBK 等 配置方式如下: <br/>
	 * Properties: email.encoding = ? <br/>
	 * XML: {@literal <email><encoding>?</encoding></email>}
	 * @see org.wdcode.web.email.EmailUtil
	 * @return 发送Email使用的编码格式
	 */
	public final static String getEmailEncoding() {
		return emailEncoding;
	}

	/**
	 * 设置发送Email使用的编码格式
	 * @param encoding 发送Email使用的编码格式
	 */
	public final static void setEmailEncoding(String encoding) {
		emailEncoding = encoding;
		setProperty(EMAIL_ENCODING, emailEncoding);
	}

	/**
	 * 获得发送Email是否需要验证,org.wdcode.web.email.EmailUtil使用.<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用true<br/>
	 * <h2>注: 取值是 true,false 配置方式如下: <br/>
	 * Properties: email.auth = ? <br/>
	 * XML: {@literal <email><auth>?</auth></email>}
	 * @see org.wdcode.web.email.EmailUtil
	 * @return 发送Email是否需要验证
	 */
	public final static boolean getEmailAuth() {
		return emailAuth;
	}

	/**
	 * 设置发送Email是否需要验证
	 * @param auth 发送Email是否需要验证
	 */
	public final static void setEmailAuth(boolean auth) {
		emailAuth = auth;
		setProperty(EMAIL_AUTH, emailAuth);
	}

	/**
	 * 获得发送Email所需要的包,org.wdcode.web.email.EmailUtil使用.<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用JavaMail<br/>
	 * <h2>注: 取值是 JavaMail,Apache 配置方式如下: <br/>
	 * Properties: email.parse = ? <br/>
	 * XML: {@literal <email><parse>?</parse></email>}
	 * @see org.wdcode.web.email.EmailUtil
	 * @return 发送Email所需要的包
	 */
	public static EmailParse getEmailParse() {
		return emailParse;
	}

	/**
	 * 获得发送邮件服务器地址,org.wdcode.web.email.EmailUtil使用.<br/>
	 * 需在配置文件中配置,如果不配置将返回""<br/>
	 * <h2>注: 配置方式如下: <br/>
	 * Properties: email.from = ? <br/>
	 * XML {@literal <email><from>?</from></email>}</h2>
	 * @see org.wdcode.web.email.EmailUtil
	 * @return 发送邮件服务器地址
	 */
	public final static String getEmailFrom() {
		return emailFrom;
	}

	/**
	 * 设置发送邮件服务器地址
	 * @param from 发送邮件服务器地址
	 */
	public final static void setEmailFrom(String from) {
		emailFrom = from;
		setProperty(EMAIL_FROM, emailFrom);
	}

	/**
	 * 获得发送邮件服务器密码,org.wdcode.web.email.EmailUtil使用.<br/>
	 * 需在配置文件中配置,如果不配置将返回"" <br/>
	 * <h2>注: 配置方式如下: <br/>
	 * Properties: email.password = ? <br/>
	 * XML: <email><password>?</password></email></h2>
	 * @see org.wdcode.web.email.EmailUtil
	 * @return 发送邮件服务器密码
	 */
	public final static String getEmailPassword() {
		return emailPassword;
	}

	/**
	 * 设置发送邮件服务器密码
	 * @param password 发送邮件服务器密码
	 */
	public final static void setEmailPassword(String password) {
		emailPassword = password;
		setProperty(EMAIL_PASSWORD, emailPassword);
	}

	/**
	 * 获得发送邮件服务器Host,org.wdcode.web.email.EmailUtil使用.<br/>
	 * 需在配置文件中配置,如果不配置将返回""<br/>
	 * <h2>注: 配置方式如下: <br/>
	 * Properties: email.host = ? <br/>
	 * XML: <email><host>?</host></email></h2>
	 * @see org.wdcode.web.email.EmailUtil
	 * @return 发送邮件服务器Host
	 */
	public final static String getEmailHost() {
		return emailHost;
	}

	/**
	 * 设置发送邮件服务器Host
	 * @param host 发送邮件服务器Host
	 */
	public final static void setEmailHost(String host) {
		emailHost = host;
		setProperty(EMAIL_HOST, emailHost);
	}

	/**
	 * 私有构造
	 */
	private WdWebParams() {}
}